package copyShallowOrDeep;

/**
* @author jie
* @version 创建时间：2017年11月29日 下午8:27:19
* 浅拷贝：使用一个已知实例对新创建实例的成员变量逐个赋值，这个方式被称为浅拷贝。

      深拷贝：当一个类的拷贝构造方法，不仅要复制对象的所有非引用成员变量值，还要为引用类型的成员变量创建新的实例，
      并且初始化为形式参数实例值。这个方式称为深拷贝
      
      浅拷贝只复制一个对象，传递引用，不能复制实例。
      深拷贝对对象内部的引用均复制，它是创建一个新的实例，并且复制实例。
*/
public class copyDemo1 {
	public static void main(String[] args) {
		Person p1 = new Person("李四","mam",23);
//		entity.Person p2 = new entity.Person(p1);
//		entity.Person p2 = null;
		try {
			Person p2 = (Person) p1.clone();
			System.out.println(p1);
			System.out.println(p2);
			
			p1.setName("张三");
			System.out.println("p1.getName()"+p1.getName().hashCode());
			System.out.println("p2.getName()"+p2.getName().hashCode());
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		
	
		
		Asian a1 = new Asian("yellow",new Person("李四","mam",23));
		Asian a2 = new Asian(a1);
		
		System.out.println(a1);
		System.out.println(a2);
		System.out.println(a1.getSkin());
		System.out.println(a2.getSkin());
		a1.setSkin("white");
		System.err.println(a2.getSkin());
		
		a1.getPerson().setName("222");
		System.out.println(a2.getPerson().getName());
		
		
//		a2.setPerson(p1);
		System.out.println(a1.getPerson()==a2.getPerson());
		System.out.println("a1.getPerson().hashCode()"+a1.getPerson().hashCode());
		System.out.println("a2.getPerson().hashCode()"+a2.getPerson().hashCode());
	
	}
}

 class Person implements Cloneable{
    private String name;
    private String sex;
    private int age;
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
    	// TODO Auto-generated method stub
//    	return (entity.Person)super.clone();
    	return super.clone();
    }
    
    public Person(String name,String sex,int age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    
    public Person(Person p){                   //拷贝构造方法，复制对象
        this.name = p.name;
        this.sex = p.sex;
        this.age = p.age;
    }

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
    
}
 
 class Asian {
	    private String skin;
	    Person person;
	    
	    public Asian(String skin,Person person){
	        this.skin = skin;
	        this.person = person;                    //引用赋值
	    }

	    public Asian(Asian asian){                 //拷贝构造方法，复制对象
	        this(asian.skin,asian.person);           
	    }

		public String getSkin() {
			return skin;
		}

		public void setSkin(String skin) {
			this.skin = skin;
		}

		public Person getPerson() {
			return person;
		}

		public void setPerson(Person person) {
			this.person = person;
		}
	    
	    
}
 
